#pragma once
#include <stdlib.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <stdio.h>

// typedef int (*handleFunc)(void *arg);
using handleFunc = int (*)(void *arg);

// 强类型枚举 C++11 特性 这个时候每一个成员都是FDEvent类型 ，如果你明确知道类型的情况下，可以使用强制类型转换
enum class FDEvent
{
    Timeout = 0x01,
    ReadEvent = 0x02,
    WriteEvent = 0x04,
};
class Channel
{
public:
    // 构造函数
    Channel(int fd, int event, handleFunc readCallBack, handleFunc writeCallBack, handleFunc destoryCallBack, void *arg);
    // 添加一个Channel
    // 修改fd的读事件（检测或者不检测）
    void updateWriteEvent(bool flag);
    // 修改fd的写事件（检测或者不检测）

    // 写事件的检测
    bool isWriteEventEnable();
    // 回调函数
    handleFunc readCallBack;
    handleFunc writeCallBack;
    handleFunc destoryCallBack;

    // 成员的处理函数
    inline int getEvent()
    {
        return m_event;
    }

    inline int getSocket()
    {
        return m_fd;
    }
    inline const void * getArg()
    {
        return m_arg;
    }


private:
    int m_fd;
    int m_event;
    // 这个参数用来小时传递参数
    void * m_arg;
};
